# REST framework之路由和渲染器
# 路由
# 传统的url路径写法
urlpatterns = [ ... url(r'(?P<version>[v1|v2]+)/pager1/$', views.Pager1View.as_view()), ]
# 使用了GenericViewSet后,url得as_view函数可以传入字典
url(r'(?P<version>[v1|v2]+)/v1/$', views.V1View.as_view({'get': 'list', 'post': 'create'})),
# 定制新的url规则
url(r'(?P<version>[v1|v2]+)/v1\.(?P<format>\w+)$', views.V1View.as_view({'get': 'list', 'post': 'create'})) # 通过上面得规则我们就可以把我们想要得编码格式写在url中,从而获得想应得数据 http://127.0.0.1:8000/api/v1/v1.json --> 获得json数据
- 上面得方式和下面得渲染器传递得format参数一致,都是给渲染器传递一个参数,这样就可以让渲染器返回相应得数据给浏览器
# 结合渲染器使用
#通过路径后在浏览器中我们看到了渲染后的页面,如果我们想只看json形式,可以通过format参数 1、http://127.0.0.1:8000/api/v1/v1/ --> 得到渲染后的页面 2、http://127.0.0.1:8000/api/v1/v1/?format=json --> 得到json数据
# 全自动路由
from django.conf.urls import url,include
from api import views
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'xxx',views.V1View) # 注册视图类,第一个参数是拼接得第一端
router.register('rt',views.V1View)
urlpatterns = [
...
url(r'^(?P<version>[v1|v2]+)/',include(router.urls))
]
# 我们访问一个错误网址即可获得所有网址:
^admin/
^api/ ^(?P<version>[v1|v2]+)/ ^xxx/$ [name='role-list']
^api/ ^(?P<version>[v1|v2]+)/ ^xxx\.(?P<format>[a-z0-9]+)/?$ [name='role-list']
^api/ ^(?P<version>[v1|v2]+)/ ^xxx/(?P<pk>[^/.]+)/$ [name='role-detail']
^api/ ^(?P<version>[v1|v2]+)/ ^xxx/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='role-detail']
^api/ ^(?P<version>[v1|v2]+)/ ^rt/$ [name='role-list']
^api/ ^(?P<version>[v1|v2]+)/ ^rt\.(?P<format>[a-z0-9]+)/?$ [name='role-list']
^api/ ^(?P<version>[v1|v2]+)/ ^rt/(?P<pk>[^/.]+)/$ [name='role-detail']
^api/ ^(?P<version>[v1|v2]+)/ ^rt/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='role-detail']
^api/ ^(?P<version>[v1|v2]+)/ ^$ [name='api-root']
^api/ ^(?P<version>[v1|v2]+)/ ^\.(?P<format>[a-z0-9]+)/?$ [name='api-root']
# 小提示:
1、全自动路由,一般只是对简单得增删改查表得时候使用
#
# 渲染器
# 渲染器简单使用
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer,AdminRenderer class TestView(APIView): renderer_classes = [AdminRenderer,JSONRenderer,BrowsableAPIRenderer] # 默认以第一个元素类进行渲染,其余得可以通过format进行选择,BrowsableAPIRenderer只是用来渲染网页得 def get(self,request,*args,**kwargs): # 获取所有数据 roles = models.Role.objects.all() # 创建分页对象 pg = MyCursorPagination() # 在数据库中获取分页数据 page_role = pg.paginate_queryset(queryset=roles, request=request, view=self) # 在全局配置PAGE_SIAE print(page_role) # 对数据进行序列化 ser = PagerSerializer(instance=page_role, many=True) return Response(ser.data) ------------------------------------------------------------- # url.py文件中 urlpatterns = [ url(r'^(?P<version>[v1|v2]+)/',include(router.urls)), url(r'(?P<version>[v1|v2]+)/test/$', views.TestView.as_view()), ]
小提示:
1、/api/v1/test/?format=api --> 访问浏览器渲染 2、/api/v1/test/?format=json --> 访问的数据进行json 3、/api/v1/test/?format=admin --> 访问数据通过admin界面
# 全局设置渲染器
REST_FRAMEWORK = { 'DEFAULT_VERSION':'v1', 'ALLOWED_VERSIONS':['v1','v2'], 'VERSION_PARAM':'version', # 允许得key;version=v1 'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning', 'DEFAULT_PARSER_CLASSES':['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser'], 'PAGE_SIZE':3, 'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer'] }
# 自定义模板
我们知道BrowsableAPIRenderer,是用来进行模板渲染得,我们可以继承它,并将模板进行重写,然后修改里面得template模板即可。